\begin{figure}[H]
	\centering
	\includegraphics[scale=0.48]{img/seq_fonctionnement.png}
	\caption{Diagramme de séquence de fonctionnement de l'ordonnanceur}
	\label{seq_fct}
\end{figure}

	Notre ordonnanceur est basé sur l'utilisation de \verb?ucontext?, le schéma ci dessus décrit le fonctionnement de l'ordonnanceur, du lancement d'un thread à sa destruction. Il est important de noter que l'ordonnanceur n'est pas un thread à proprement parler mais une partie du code contenu dans \verb?thread_yield()?, il est représenté ainsi par soucis de lisibilité.\\

	Tout d'abord l'utilisateur doit créer un thread, ce qui cause un appel aux fonctions \verb?getcontext()? et \verb?makecontext()? afin de récupérer le contexte actuel et d'en créer un nouveau pour le thread. Il va ensuite join ce thread ce qui aura pour effet de lancer l'ordonnanceur et donc le thread. Il est important de noter que le premier appel à \verb?thread_yield()? et donc à l'ordonnanceur déclenchera l'initialisation de la bibliothèque ( création du "thread" main, initialisation des listes ).\\
	
	L'ordonnanceur est lancé grâce à l'appel à la fonction \verb?thread_yield()? qui se trouve dans boucle d'attente de \verb?thread_join()?. Le thread va donc s'exécuter jusqu'à rencontrer un nouveau \verb?thread_yield()?. Dans \verb?thread_yield()?, on trouve un appel a \verb?swapcontext()? qui va sauvegarder le contexte du thread actif et charger le nouveau contexte. Une fois que le code du thread aura atteint l'appel à \verb?thread_exit()?, il serra supprimé et sa valeur de retour sera fournie à la fonction \verb?thread_join()?.